package com.example.interesting.distributed.lock.realize.annotation;

import com.example.interesting.distributed.lock.realize.strategy.*;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author fyw
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DistributedLockAnnotation {

    /**
     * 分布式锁资源名称，即redis第一层级名，为空的话取“包名+类名+方法名”
     */
    String name() default "";

    /**
     * 分布式锁具体的key值， 支持Spel表达式，默认生成key的策略 = name + keys
     */
    String[] keys() default "";

    /**
     * 分布式锁的过期时间，单位毫秒，默认30000毫秒
     */
    long expire() default 30000L;

    /**
     * 分布式锁获取超时时间，单位毫秒，默认30000毫秒
     */
    long acquireTimeout() default 30000L;

    /**
     * 分布式锁获取失败提示信息
     */
    String failMsg() default "业务正在处理中，请勿重复操作";


    /**
     * 分布式锁默认key生成策略
     */
    Class<? extends DistributedLockKeyBuilder> keyBuilder() default DefaultDistributedLockKeyBuilder.class;

    /**
     * 分布式锁获取失败处理策略
     */
    Class<? extends DistributedLockFailureStrategy> failureStrategy() default DefaultDistributedLockFailureStrategy.class;


    /**
     * 分布式锁执行器
     */
    Class<? extends DistributedLockExecutorStrategy> executor() default DefaultDistributedLockExecutorStrategy.class;
}
